home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / bstring / ffs.c < prev    next >
C/C++ Source or Header  |  1989-06-19  |  2KB  |  87 lines

  1. /* 
  2.  * ffs.c --
  3.  *
  4.  *    Source code for the "ffs" library routine.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/bstring/RCS/ffs.c,v 1.3 89/06/19 14:15:25 jhh Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. /*
  21.  * The following mask is used to detect proper alignment of addresses
  22.  * for doing word operations instead of byte operations.  It is
  23.  * machine-dependent.  If none of the following bits are set in an
  24.  * address, then word-based operations may be used. This value is imported
  25.  * from machparam.h
  26.  */
  27.  
  28. #include "machparam.h"
  29.  
  30. #define WORDMASK WORD_ALIGN_MASK
  31.  
  32. /*
  33.  * Used to find the first set bit. Value of the array is the index of the
  34.  * first set bit in the array index.
  35.  */
  36. static int lookup[16] = {
  37.     0,    /* 0x0    */
  38.     1,    /* 0x01   */
  39.     2,    /* 0x10   */
  40.     1,    /* 0x11   */
  41.     3,    /* 0x100  */
  42.     1,    /* 0x101  */
  43.     2,    /* 0x110  */
  44.     1,    /* 0x111  */
  45.     4,    /* 0x1000 */
  46.     1,    /* 0x1001 */
  47.     2,    /* 0x1010 */
  48.     1,    /* 0x1011 */
  49.     3,    /* 0x1100 */
  50.     1,    /* 0x1101 */
  51.     2,    /* 0x1110 */
  52.     1    /* 0x1111 */
  53. };
  54.  
  55. /*
  56.  *----------------------------------------------------------------------
  57.  *
  58.  * ffs --
  59.  *
  60.  *    Find the least-significant 1-bit in the argument.
  61.  *
  62.  * Results:
  63.  *    If there are no one-bits in the argument, then 0 is returned.
  64.  *    Otherwise the return value is the index of the least-significant
  65.  *    1 bit, where "1" corresponds to the low-order bit.
  66.  *
  67.  * Side effects:
  68.  *    None.
  69.  *
  70.  *----------------------------------------------------------------------
  71.  */
  72.  
  73. int
  74. ffs(i)
  75.     int i;            /* Value to check for ones. */
  76. {
  77.     register int value, shiftcount;
  78.  
  79.     value = (unsigned int) i;
  80.     for (shiftcount = 0; value != 0; value >>= 4, shiftcount += 4) {
  81.     if (value & 0xf) {
  82.         return (lookup[value & 0xf] + shiftcount);
  83.     }
  84.     }
  85.     return 0;
  86. }
  87.